﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Coolite.Ext.Web;
using System.Web.Caching;
using System.Xml;
using ENT.GP.Core;
using ENT.GP.Core.Core;
using System.Configuration;
namespace entgp
{
    public partial class Principal : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (Session.Count > 0)
                {

                    lblUser.Text = "Bienvenido " + Session["Usuario"].ToString();
                    lblNombre.Text = " " + Session["NombreUsuario"].ToString();
                    lblRol.Text = " " + Session["Rol"].ToString();

                    //lblUsuario.Text = Session["usuario"].ToString();
                    if (!Ext.IsAjaxRequest)
                    {

                        //this.Session["Coolite.Theme"] = Coolite.Ext.Web.Theme.Default;


                        string cargarTab = string.Empty;

                        if (!this.IsPostBack)
                        {
                            Ext.Notification.Show(new Notification.Config
                            {
                                Title = "Autenticacion",
                                Icon = Icon.Information,
                                ShowPin = true,
                                //                    Tools = new ToolsCollection { new Tool { Type = ToolType.Help, Handler = Ext.MessageBox.Alert("Ayuda", "Obtiene ayuda del sistema").Serialize() } },
                                Html = string.Format("Bienvenido {0} al sistema ENT-PM", lblNombre.Text)
                            });
                            //GenerarFrontal();
                            //this.ConstruirArbol(arbolNavegacion.Root, null, true);
                            this.ConstruirArboles(null);

                            //string url = string.Empty;
                            //if (this.Request.QueryString.Count > 0)
                            //{
                            //    url = this.Request.QueryString[0];
                            //}

                            //if (!string.IsNullOrEmpty(url) && this.CheckQueryString(url))
                            //{
                            //    cargarTab = string.Concat("cargarTab(", JSON.Serialize(url), ", '-');");
                            //    this.smPrincipal.Listeners.DocumentReady.Handler = cargarTab;
                            //}
                        }

                        //bool refreshMapSite = false;

                        //if (this.Request.IsLocal && Request.QueryString["refreshMap"] != null)
                        //{
                        //    refreshMapSite = true;
                        //    //refresh map site
                        //    //UIHelpers.BuildTreeNodes(true);
                        //}

                        //if (refreshMapSite)
                        //{
                        //    //TODO: ADD JSA. PARA QUE SIRVE ESTA LINEA?????
                        //    Response.Redirect("~/");
                        //}
                    }
                }
                else
                {
                    Response.Redirect("Default.aspx");
                }
            }
            catch 
            {

            }
        }

        //Inicializando variables
        public string idnodo = string.Empty;
        public string nombrenodo = string.Empty;
        public string urlnodo = string.Empty;
        public string padrenodo = string.Empty;
        public Coolite.Ext.Web.Accordion accNavegacion = new Coolite.Ext.Web.Accordion();

        //Funcion para Crear los TreePanel que se mostraran en el acordeon, leyendo los elementos desde un xml
        private Coolite.Ext.Web.TreePanel ConstruirArboles(Coolite.Ext.Web.TreePanel arbolacord)
        {
            try
            {
                accNavegacion.ID = "accNavegacion";
                accNavegacion.Animate = false;
                //Lectura del xml
                XmlDocument xmlArbol = new XmlDocument();
                var ruta = "";
                ruta = string.Format("{0}/resources/arbol{1}.xml", ConfigurationManager.AppSettings.Get("SD"), Session["CRol"].ToString());
                
                xmlArbol.Load(HttpContext.Current.Server.MapPath(ruta));
                XmlNodeList nodoslista = xmlArbol.GetElementsByTagName("nodo");
                XmlNodeList modulos = nodoslista[0].ChildNodes;
                int id = 0;
                //Recorrido de los modulos principales y creación de los TreePanel
                foreach (XmlElement modulo in modulos)
                {
                    TreePanel subArbol = new TreePanel();
                    subArbol.ID = modulo.GetAttribute("idnodo");
                    subArbol.RootVisible = false;
                    subArbol.AutoScroll = true;
                    subArbol.ContainerScroll = true;
                    subArbol.Lines = false;
                    subArbol.Title = modulo.GetAttribute("nombre");
                    //Llamada al metodo de construccion de los nodos del arbol
                    this.ConstruirArbol(subArbol.Root, modulo.GetAttribute("idnodo"), false);
                    //Implementación de un listener para los nodos del arbol
                    subArbol.Listeners.Click.Handler = "if(node.attributes.href){e.stopEvent();cargarTab(node.attributes.hrefTarget, node.attributes.href, node.id, node.text);}";
                    //Agregación de el TreePanel al acordeon
                    accNavegacion.Items.Add(subArbol);
                    id++;
                }
                pnlOeste.Add(accNavegacion);
            }
            catch 
            {

            }
            return arbolacord;
        }

        //Función para construir los nodos de los arboles de navegación
        //Parametros de entrada: nodes = nodo de root de arbol a costruir, idnodobase = codigo del nodo que sera el padre principal
        private Coolite.Ext.Web.TreeNodeCollection ConstruirArbol(Coolite.Ext.Web.TreeNodeCollection nodes, string idnodobase, bool llamada)
        {
            try
            {
                //Si Nodos es nulo se crea una coleccion de nodos para guardar los nodos a generarse
                if (nodes == null)
                {
                    nodes = new Coolite.Ext.Web.TreeNodeCollection();
                }
                //Creacion del nodo principal del arbol
                var root = new Coolite.Ext.Web.TreeNode();
                root.Text = "root";
                nodes.Add(root);
                
                //Lectura del xml
                var xDoc = new XmlDocument();
                var ruta = "";
                ruta = string.Format("{0}/resources/arbol{1}.xml", ConfigurationManager.AppSettings.Get("SD"), Session["CRol"].ToString());
                //xDoc.Load(HttpContext.Current.Server.MapPath("/entgp/resources/arbol" + Session["CRol"].ToString() + ".xml"));
                xDoc.Load(HttpContext.Current.Server.MapPath(ruta));
                XmlNodeList nodosarbol = xDoc.GetElementsByTagName("nodo");
                //Obtención de los hijos del nodo
                XmlNodeList listamodulos = nodosarbol[0].ChildNodes;
                int i = 0;
                //Recorrido de cada uno de los hijos
                foreach (XmlElement nodoshijos1 in listamodulos)
                {
                    if (llamada)
                    {
                        var nodocombo = new Coolite.Ext.Web.MenuItem();
                        nodocombo.Text = nodoshijos1.GetAttribute("nombre");
                        nodocombo.Listeners.Click.Handler = "recargar(#{subArbol},'" + nodoshijos1.GetAttribute("idnodo") + "');";
                        //mnuModulos.Items.Add(nodocombo);
                    }

                    //Creación de un nuevo nodo y asignacion de las propiedades
                    var nuevonodo = new Coolite.Ext.Web.TreeNode();
                    nuevonodo.Text = nodoshijos1.GetAttribute("nombre");
                    nuevonodo.HrefTarget = nodoshijos1.GetAttribute("path");
                    nuevonodo.NodeID = nodoshijos1.GetAttribute("idnodo");
                    nuevonodo.Href = nodoshijos1.GetAttribute("url");
                    XmlNodeList listahijos = null;
                    //Para determinar el nodo padre dependiendo del id enviado
                    if (string.IsNullOrEmpty(idnodobase))
                    {
                        root.Nodes.Add(nuevonodo);
                        listahijos = listamodulos[i].ChildNodes;
                    }
                    else
                    {
                        if (idnodobase == nodoshijos1.GetAttribute("idnodo"))
                        {
                            listahijos = listamodulos[i].ChildNodes;
                        }
                    }
                    int j = 0;

                    if (listahijos != null)
                        //Recorrido de cada uno de los hijos
                        foreach (XmlElement nodoshijos2 in listahijos)
                        {
                            //Creación de un nuevo nodo y asignacion de las propiedades
                            var nuevonodo1 = new Coolite.Ext.Web.TreeNode();
                            nuevonodo1.Text = nodoshijos2.GetAttribute("nombre");
                            nuevonodo1.HrefTarget = nodoshijos2.GetAttribute("path");
                            nuevonodo1.NodeID = nodoshijos2.GetAttribute("idnodo");
                            nuevonodo1.Href = nodoshijos2.GetAttribute("url");
                            if (string.IsNullOrEmpty(idnodobase))
                            {
                                nuevonodo.Nodes.Add(nuevonodo1);
                            }
                            else
                            {
                                root.Nodes.Add(nuevonodo1);
                            }
                            XmlNodeList listahijos1 = listahijos[j].ChildNodes;
                            int k = 0;

                            if (listahijos1 != null)
                                //Recorrido de cada uno de los hijos
                                foreach (XmlElement nodoshijos3 in listahijos1)
                                {
                                    //Creación de un nuevo nodo y asignacion de las propiedades
                                    var nuevonodo2 = new Coolite.Ext.Web.TreeNode();
                                    nuevonodo2.Text = nodoshijos3.GetAttribute("nombre");
                                    nuevonodo2.HrefTarget = nodoshijos3.GetAttribute("path");
                                    nuevonodo2.NodeID = nodoshijos3.GetAttribute("idnodo");
                                    nuevonodo2.Href = nodoshijos3.GetAttribute("url");
                                    nuevonodo2.Qtip = nodoshijos3.GetAttribute("nombre");
                                    nuevonodo1.Nodes.Add(nuevonodo2);
                                    XmlNodeList listahijos2 = listahijos1[k].ChildNodes;
                                    int l = 0;

                                    if (listahijos2 != null)
                                        //Recorrido de cada uno de los hijos
                                        foreach (XmlElement nodoshijos4 in listahijos2)
                                        {
                                            //Creación de un nuevo nodo y asignacion de las propiedades
                                            var nuevonodo3 = new Coolite.Ext.Web.TreeNode();
                                            nuevonodo3.Text = nodoshijos4.GetAttribute("nombre");
                                            nuevonodo3.HrefTarget = nodoshijos4.GetAttribute("path");
                                            nuevonodo3.NodeID = nodoshijos4.GetAttribute("idnodo");
                                            nuevonodo3.Href = nodoshijos4.GetAttribute("url");
                                            nuevonodo3.Qtip = nodoshijos4.GetAttribute("nombre");
                                            nuevonodo2.Nodes.Add(nuevonodo3);
                                            XmlNodeList listahijos3 = listahijos2[l].ChildNodes;

                                            if (listahijos3 != null)
                                                //Recorrido de cada uno de los hijos
                                                foreach (XmlElement nodoshijos5 in listahijos3)
                                                {
                                                    //Creación de un nuevo nodo y asignacion de las propiedades
                                                    var nuevonodo4 = new Coolite.Ext.Web.TreeNode();
                                                    nuevonodo4.Text = nodoshijos5.GetAttribute("nombre");
                                                    nuevonodo4.HrefTarget = nodoshijos5.GetAttribute("path");
                                                    nuevonodo4.NodeID = nodoshijos5.GetAttribute("idnodo");
                                                    nuevonodo4.Href = nodoshijos5.GetAttribute("url");
                                                    nuevonodo4.Qtip = nodoshijos5.GetAttribute("nombre");
                                                    nuevonodo3.Nodes.Add(nuevonodo4);
                                                }
                                            l++;
                                        }
                                    k++;
                                }
                            j++;
                        }
                    i++;

                }
            }
            catch 
            {

            }
            return nodes;
        }
        
        
        //Metodo para recargar los datos de la pagina desde el cache
        protected void RefreshHomeTabData(object sender, StoreRefreshDataEventArgs e)
        {
            GenerarFrontal();
        }

        private void GenerarFrontal()
        {
            try
            {
                var data = this.Page.Cache["ExamplesGroups"] as List<GrupoPrincipal>;

                if (data == null)
                {
                    data = new List<GrupoPrincipal>();
                    UIHelpers.CargarFrontal(data, "frontal" + Session["CRol"].ToString() + ".xml");
                    
                    Page.Cache.Add("ExamplesGroups", data, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
                }

                Store1.DataSource = data;
                Store1.DataBind();
            }
            catch (Exception ex)
            {
                Util.RegistarLog(ex);
            }
        }

        //Metodo para redireccionar a la pagina de Logueo
        protected void btnSalirENTPM_Click(object sender, AjaxEventArgs e)
        {
            Session.Abandon();
            Session.Clear();
            Response.Redirect("Default.aspx");
        }

        protected void verMiCuenta_Click(object sender, AjaxEventArgs e)
        {
            try
            {

                int idUsuario;
                int.TryParse(Session["IdUsuario"].ToString(), out idUsuario);
                wucUsuarios1.Mostrar("Editar", idUsuario);
            }
            catch (Exception ex)
            {
                Util.RegistarLog(Environment.NewLine + ex.ToString() + Environment.NewLine);
            }
        }
    }
}